package com.neardrug.common;

import com.neardrug.context.BaseContext;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Executors;

public class OnlineUserManager {
    // 存储在线用户的集合
    private static Set<Integer> onlineUsers = ConcurrentHashMap.newKeySet();
    // 存储用户的登录时间
    private static ConcurrentHashMap<Integer, Long> userLoginTimes = new ConcurrentHashMap<>();
    // JWT 过期时间（毫秒）
    private static final long JWT_EXPIRY_TIME = 14400000; // 4小时
    //private static final long JWT_EXPIRY_TIME = 120000; // 2分钟

    // 定时任务，检查在线用户的有效性
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    static {
        scheduler.scheduleAtFixedRate(() -> {
            long currentTime = System.currentTimeMillis();
            onlineUsers.forEach(userId -> {
                // 检查用户的登录时间是否超过 JWT 过期时间
                Long loginTime = userLoginTimes.get(userId);
                if (loginTime != null && (currentTime - loginTime) > JWT_EXPIRY_TIME) {
                    userLogout(userId); // 用户令牌已过期，注销用户
                }
            });
        }, 0, 1, TimeUnit.HOURS); // 每多久检查一次
    }

    // 用户登录
    public static void userLogin(Integer userId) {
        onlineUsers.add(userId);
        userLoginTimes.put(userId, System.currentTimeMillis()); // 记录登录时间
    }

    // 用户注销
    public static void userLogout() {
        Integer userId = BaseContext.getCurrentId();
        if (userId != null) {
            userLogout(userId); // 调用重载的注销方法
        }
    }

    // 用户注销（重载方法）
    public static void userLogout(Integer userId) {
        onlineUsers.remove(userId);
        userLoginTimes.remove(userId); // 移除登录时间
        BaseContext.removeCurrentId(); // 清除当前用户 ID
    }

    // 判断用户是否在线
    public static boolean isUserOnline(Integer userId) {
        return onlineUsers.contains(userId);
    }

    // 获取在线用户集合的拷贝（只读）
    public static Set<Integer> getOnlineUsers() {
        return new HashSet<>(onlineUsers); // 返回在线用户的拷贝
    }
}
